package futbol.tacticas.concursantes2007.tikitaka.tactica;
/*
 * Tactica1.java
 *
 * Created on 29 de marzo de 2007, 23:59
 *
 */

import futbol.tacticas.Comando;
import futbol.tacticas.SituacionJugadores;
import futbol.General;
import futbol.tacticas.concursantes.SistemVacio;

import java.util.Vector;
import java.awt.Color;
import java.awt.Point;

/**
 *
 * @author Ismael Mariscal Mena
 */
public class Tactica1 extends TacticaBase {
    
    int PORTERO = 0;
    int DEFENSA_IZQUIERDO = 1;
    int DEFENSA_DERECHO = 2;
    int MEDIO_CENTRO = 6;
    int MEDIO_IZQUIERDO = 7;
    int MEDIO_DERECHO = 8;
    int DELANTERO_LATERAL = 5;
    int DELANTERO = 10;
    int LIBRE = 9;
    int LIBRE2 = 3;
    int LIBRE3 = 4;
    
    
    
    public class Jugador extends TacticaBase.JugadorBase {
    
        /** Creates a new instance of DefensaIzquierdo */
        public Jugador(int jugador, Point posicion, Estado estado, Object obj) {
            super(jugador, posicion);
            maquinaEstados = new MaquinaEstados(obj);
            maquinaEstados.setEstadoActual(estado);
            int i = DEFENSA_IZQUIERDO;
            
        }

        public void actualizar()
        {
            maquinaEstados.actualizar();
        }

        public void GestionarMensaje(Mensaje mensaje)
        {

        }
    }
    
    /** Creates a new instance of Tactica1 */
    public Tactica1() {
        
        equipo = new Equipo();
        jugador = new Jugador[11];
        Point pos[] = new Point[11];
        
        jugador[PORTERO] = new Tactica1.Jugador(PORTERO, new Point(-155, 0), new PorteroTactica1(), this);
        equipo.setFuerza(PORTERO, 4);
//        equipo.setVelocidad(PORTERO, 6);
        
        jugador[DEFENSA_IZQUIERDO] = new Tactica1.Jugador(DEFENSA_IZQUIERDO, /*new Point(-155, -120)*/ new Point(-65, -25), new Tactica1DefensaIzquierdo(), this);
        equipo.setFuerza(DEFENSA_IZQUIERDO, 4);
//        equipo.setVelocidad(DEFENSA_IZQUIERDO, 6);
        
        jugador[DEFENSA_DERECHO] = new Tactica1.Jugador(DEFENSA_DERECHO, /*new Point(160, 0) */new Point(-65, 25), new Tactica1DefensaDerecho(), this);
        equipo.setFuerza(DEFENSA_DERECHO, 4);
//        equipo.setVelocidad(DEFENSA_DERECHO, 6);
        
        jugador[MEDIO_CENTRO] = new Tactica1.Jugador(MEDIO_CENTRO, /*new Point(-155, -120) */new Point(-55, 0), new Tactica1MedioCentro(), this);
        equipo.setFuerza(MEDIO_CENTRO, 6);
//        equipo.setVelocidad(MEDIO_CENTRO, 4);
        
        jugador[MEDIO_IZQUIERDO] = new Tactica1.Jugador(MEDIO_IZQUIERDO, /*new Point(-155, -120)*/ new Point(160, -60), new Tactica1MedioIzquierdo(), this);
        equipo.setFuerza(MEDIO_IZQUIERDO, 6);
//        equipo.setVelocidad(MEDIO_IZQUIERDO, 4);
        
        jugador[MEDIO_DERECHO] = new Tactica1.Jugador(MEDIO_DERECHO, /*new Point(-155, -120)*/ new Point(160, 60), new Tactica1MedioDerecho(), this);
        equipo.setFuerza(MEDIO_DERECHO, 6);
//        equipo.setVelocidad(MEDIO_DERECHO, 4);
        
        jugador[DELANTERO_LATERAL] = new Tactica1.Jugador(DELANTERO_LATERAL, /*new Point(-155, -120)*/ new Point(160, 0), new Tactica1DelanteroLateral(), this);
        equipo.setFuerza(DELANTERO_LATERAL, 6);
//        equipo.setVelocidad(DELANTERO_LATERAL, 4);
        
        jugador[DELANTERO] = new Tactica1.Jugador(DELANTERO, /*new Point(-155, -120)*/ new Point(160, 60), new DelanteroTactica1(), this);
        equipo.setFuerza(DELANTERO, 7);
//        equipo.setVelocidad(DELANTERO, 3);
        
        jugador[LIBRE] = new Tactica1.Jugador(LIBRE, new Point(0, 0), new Tactica1LibreMedio(), this);
        equipo.setFuerza(LIBRE, 4);
//        equipo.setVelocidad(LIBRE, 6);
        
        jugador[LIBRE2] = new Tactica1.Jugador(LIBRE2, new Point(-40, 40), new Tactica1LibreDerecho(), this);
        equipo.setFuerza(LIBRE2, 4);
//        equipo.setVelocidad(LIBRE2, 6);
        
        jugador[LIBRE3] = new Tactica1.Jugador(LIBRE3, new Point(-40, -40), new Tactica1LibreIzquierdo(), this);
        equipo.setFuerza(LIBRE3, 4);
//        equipo.setVelocidad(LIBRE3, 6);
        
        contrario = new Equipo(true);
        int velocidad[] = {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
        contrario.setVelocidad(velocidad);
        int fuerza[] = {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
        contrario.setFuerza(fuerza);
        
        //Posicion incial de los jugadores
        for (int i = 0; i < 11; i++)
            pos[i] = jugador[i].getPosicionBase();
        equipo.setPosicionActual(pos);
        
        balon = new Balon();
        
        marcador = new int[4];
        for (int i = 0; i < 4; i++)
            marcador[i] = 0;
        
        
//        velocidadContrario = new int[11][9];
//        for (int i = 0; i < 11; i++)
//        {
//            for (int j = 0; j < 9; j++)
//                velocidadContrario[i][j] = 0;
//        }
    }
    
    public String getNombre(){
        return "Tactica1";
    }
    
    public Color getColor1(){
        return Color.orange;
    }
    
    public Color getColor2(){
        return Color.red;
    }
    
    public Color getColorNumero(){
        return Color.black;
    }
    
    public int getFuerza(int n){
        return equipo.getFuerza(n); // nValores[n][2];
    }
    public int getXInicial(int n){
        return jugador[n].getPosicion().x;
    }
    
    public int getYInicial(int n){
        return jugador[n].getPosicion().y;
    }
    public Vector<Comando> getComandos(SituacionJugadores sj)
    {
        comandos=new Vector();
        equipo.setPosicionActual(sj.getMisJugadores());
        contrario.setPosicionActual(sj.getContrario());
        balon.setPosicionActual(sj.getBola());
        actualizar();
        //System.out.println("\nTiempo: " + tiempoPartido);
        for (int i = 0; i < 11; i++)
            SistemVacio.out.println("Jugador  : " + i + " x:" + equipo.getPosicion(i).x + " y:" + equipo.getPosicion(i).y + " f:" + equipo.getFuerza(i) + " v:" + equipo.getVelocidad(i));
        for (int i = 0; i < 11; i++)
            SistemVacio.out.println("Contrario: " + i + " x:" + contrario.getPosicion(i).x + " y:" + contrario.getPosicion(i).y + " f:" + contrario.getFuerza(i) + " v:" + contrario.getVelocidad(i));
        SistemVacio.out.println("Balon: " + balon.getPosicionActual() + " Velocidad: " + balon.getVelocidad());
        int marcar = balon.esGol();
        if (marcar != -1)
        {
            //System.out.println();
            marcador[marcar]++;
            //System.out.println("Gol de " + marcar + " Marcador: " + marcador[0] + "-" + marcador[1] + "-" + marcador[2] + "-" + marcador[3]);
            balon.ponerEnElCentro();
        }
        MDouble tiempo = new MDouble(), tiempoContrario = new MDouble();
//        jugadorMasCercaBalon = -1;
//        for (int i = 0; i < 11; i++)
//            if (Util.distancia(balon.getPosicionActual(), equipo.posicionActual[i]) < 10)
//                jugadorMasCercaBalon = i;
        jugadorMasCercaBalon = equipo.jugadorMasCercanoBola(balon, tiempo);
        jugadorContrarioMasCercaBalon = contrario.jugadorMasCercanoBola(balon, tiempoContrario);
        //System.out.println("Jugador ms cerca balon:   " + jugadorMasCercaBalon + " Tiempo: " + tiempo.v + " Distancia: " + Util.distancia(balon.getPosicionActual(), equipo.getPosicion(jugadorMasCercaBalon)));
        //System.out.println("Contrario mas cerca balon: " + jugadorContrarioMasCercaBalon + " Tiempo: " + tiempoContrario.v + " Distancia: " + Util.distancia(balon.getPosicionActual(), contrario.getPosicion(jugadorContrarioMasCercaBalon)));
//        for (int cont = 0; cont < 10000; cont++)
//            jugadorMasCercaBalon = equipo.jugadorMasCercanoBola(balon, tiempo);
        for (int i = 0; i < 11; i++)
            jugador[i].actualizar();
        
        tiempoPartido++;
        return comandos;
    }
    
    public Vector<Comando> getComandos()
    {
        return comandos;
    }
    
    public void actualizar()
    {
        int tjugador, tcontrario;
//        System.out.println("\nTiempo: " + tiempoPartido);
//        for (int i = 0; i < 11; i++)
//            System.out.println("Jugador  : " + i + " x:" + equipo.getPosicion(i).x + " y:" + equipo.getPosicion(i).y + " f:" + equipo.getFuerza(i) + " v:" + equipo.getVelocidad(i));
//        for (int i = 0; i < 11; i++)
//            System.out.println("Contrario: " + i + " x:" + contrario.getPosicion(i).x + " y:" + contrario.getPosicion(i).y + " f:" + contrario.getFuerza(i) + " v:" + contrario.getVelocidad(i));
//        System.out.println("Balon: " + balon.getPosicionActual() + " Velocidad: " + balon.getVelocidad());
        int marcar = balon.esGol();
        if (marcar != -1)
        {
//            System.out.println();
            marcador[marcar]++;
//            System.out.println("Gol de " + marcar + " Marcador: " + marcador[0] + "-" + marcador[1] + "-" + marcador[2] + "-" + marcador[3]);
            balon.ponerEnElCentro();
        }
        MDouble tiempo = new MDouble(), tiempoContrario = new MDouble();
        jugadorMasCercaBalon = equipo.jugadorMasCercanoBola(balon, tiempo);
        tjugador = (int)Math.floor(tiempo.v);
        jugadorContrarioMasCercaBalon = contrario.jugadorMasCercanoBola(balon, tiempoContrario);
        tcontrario = (int)Math.floor(tiempo.v);
//        System.out.println("Jugador ms cerca balon:   " + jugadorMasCercaBalon + " Tiempo: " + tiempo.v + " Distancia: " + Util.distancia(balon.getPosicionActual(), equipo.getPosicion(jugadorMasCercaBalon)));
//        System.out.println("Contrario mas cerca balon: " + jugadorContrarioMasCercaBalon + " Tiempo: " + tiempoContrario.v + " Distancia: " + Util.distancia(balon.getPosicionActual(), contrario.getPosicion(jugadorContrarioMasCercaBalon)));
        
        for (int i = 0; i < 11; i++)
            jugador[i].actualizar();
        
        tiempoPartido++;
    }
    
    public void GestionarMensaje(Mensaje mensaje)
    {

    }
}
